
from matplotlib import pyplot as plt
import pywebio
import numpy as np
import pandas as pd
import draw_table.draw_table

def generate_pie_chart(data, year):
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    countries = data['Country']
    values = data[year]
    # 如果values中有null，用0填充

    if values.isnull().any():
        values = values.fillna(0)

    # 按照 values 排序，并同时更新对应的 countries 列表顺序
    sorted_data = sorted(zip(values, countries), key=lambda x: x[0], reverse=True)
    values_sorted, countries_sorted = zip(*sorted_data)

    # 只保留前10个国家的数据
    top_10_values = values_sorted[:10]
    top_10_countries = countries_sorted[:10]

    # 计算其他国家的总和
    other_sum = sum(values_sorted[10:])

    # 将其他国家的数据添加到前10个国家中
    top_10_values = list(top_10_values) + [other_sum]
    top_10_countries = list(top_10_countries) + ['Other']

    # 设置饼图的半径比例，这里假定要让饼图稍微扁平一些
    radius_ratio = 0.8
    # 设置颜色列表，前10个国家使用默认颜色，"Other" 使用黑色
    colors = plt.rcParams['axes.prop_cycle'].by_key()['color'][:10] + ['black']

    # 绘制饼图，调整扇形半径，并开启黑色边框
    fig, ax = plt.subplots(facecolor='white', frameon=True)
    wedges, texts, autotexts = ax.pie(top_10_values, labels=top_10_countries, autopct='%.1f%%',
                                      startangle=90, wedgeprops=dict(width=radius_ratio), colors=colors)
    plt.title(f'{year}年gdp数据饼图')
    # 自动百分比标签设置可见性，只对前10个标签有效
    for i, at in enumerate(autotexts):
        # 不显示“Other”标签的百分比
        if i == 10:
            at.set_visible(False)
        else:
            at.set_visible(True) if at.get_text() != '' else at.set_visible(False)

    # 设置边框颜色为黑色
    ax.spines['bottom'].set_color('black')
    ax.spines['top'].set_color('black')
    ax.spines['right'].set_color('black')
    ax.spines['left'].set_color('black')

    # 保存图像到临时文件
    tmp_file = './output_img/pie_chart.png'
    plt.savefig(tmp_file)
    plt.close()


    # 创建DataFrame
    df = pd.DataFrame({
        'Country': top_10_countries,
        'Value': top_10_values
    })
    draw_table.draw_table.output_dataframe(df)

    # 将图像传输到Web界面
    pywebio.output.put_image(open(tmp_file, 'rb').read())